iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 28
0

Scheduling Framework 是k8s scheduler上的一個結構, 支援自定義調度器Plugin, 這些Plugin可以作為原有調度器的延伸,Scheduling Framework會定義一些擴展點讓用戶可以在Plugin上依照情境搭配多個擴展點使用。
在Pod的調度週期可以分為調度(Scheduling Cycle)和綁定(Binding Cycle)兩個階段, 調度是為了要幫Pod選定一個適合的節點, 綁定則是要將調度的結果通知Cluster, 調度的過程是有順序的, 綁定則是併發的, 如果Pod在調度的過程中發生錯誤則會被放回調度序列重新排隊。

https://ithelp.ithome.com.tw/upload/images/20201006/20129656aM3siCEDK6.png
圖片來源

擴展點說明

  • QueueSort: 用在調度序列排序, 一次只有一個調度器Plugin可以運作
  • PreFilter: 在Pod調度前先對cluster或pod進行的檢查, 一個調度週期只會做一次, 如果檢查失敗會中斷調度
  • Filter: 過濾不能運行Pod的節點
  • PostFilter: 節點預選後調用的, 可以用來記錄log
  • PreScore: 預先針對調度節點打分數, 如果檢查失敗會中斷調度
  • Score: 根據配置的權重針對調度節點打分數
  • NormalizeScore: 在結算節點排名之前修改節點分數, 如果檢查失敗會中斷調度
  • Reserve: 為防止資源競爭需要先幫選定的Pod預留節點上的資源
  • Permit: 針對Pod綁定前檢查或是延遲Pod綁定
    • approve: 所有Permit Plugin檢查成功後就將Pod發送出去綁定
    • deny: 只要有Permit Plugin檢查失敗, 就將Pod退回到調度序列, 並調用Unreserve
    • wait: 如果有Permit Plugin返回等待中, Pod的週期就會一直停在等待的狀態, 如果在超時前都無法完成則會進行deny的流程
  • PreBind: 在Pod綁定到節點之前執行
  • Bind: 在所有PreBind都執行完後才執行
  • PostBind: Pod成功綁定後才執行, 是綁定(Binding Cycle)的最後一個擴展點
  • Unreserve: Pod保留後被拒絕才會執行

調度器一次只處理一個調度週期,在下一個調度開始之前會先確認所有包含Reserve在內的擴展點都已經完成, Plugin API必須要對調度器註冊並依照配置文件配置初始化內容才能使用擴展點接口, 在調度器的配置中大部分的Plugin都是啟用的。

  • 擴展點接口範例參考官網
    type Plugin interface {
       Name() string
    }
    
    type QueueSortPlugin interface {
       Plugin
       Less(*v1.pod, *v1.pod) bool
    }
    
    type PreFilterPlugin interface {
       Plugin
       PreFilter(context.Context, *framework.CycleState, *v1.pod) error
    }
    
    // ...
    

今日小結

今天就這樣。


上一篇
day27 Resource Quotas and Limit Ranges
下一篇
day29 k8s 的 devops
系列文
K8S - 30天從擦槍到提槍上陣學習筆記。30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言